package com.jiyun.user.controller;

import com.alibaba.fastjson2.JSON;
import com.jiyun.Result.Result;
import com.jiyun.common.pojo.home.User;
import com.jiyun.common.pojo.user.Dto.UserPass;
import com.jiyun.common.vo.R;
import com.jiyun.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@RestController
@Slf4j
public class UserController {
    @Autowired
    private UserService userService;

    @Autowired
    RedisTemplate redisTemplate;

    @GetMapping("/user/findAll")
    public Result findAll() {
        List<User> userList = userService.findAll();
        return Result.ok(userList);
    }

    /**
     * 处理用户注册请求
     * <p>
     * 该方法通过POST请求接收用户信息，并调用userService进行注册操作
     *
     * @param user 用户对象，包含用户信息如用户名、密码等，由请求体自动绑定
     * @return 返回注册结果，如果注册成功，则返回OK
     */
    @PostMapping("/user/register")
    public Result register(@RequestBody User user) {
        // 记录注册用户的日志信息
        log.info("register user:{}", user);

        // 调用用户服务的注册方法，执行用户注册逻辑
        userService.register(user);

        // 返回注册成功的结果
        return Result.ok();
    }


    /**
     * 发送验证码接口
     * 该接口接收一个电话号码作为参数，并向该号码发送一个验证码
     * 主要用途是用户在注册、登录或找回密码时，通过手机号码验证用户身份
     *
     * @param phone 接收验证码的电话号码
     * @return 返回一个结果对象，表示验证码发送是否成功
     * @throws Exception 如果验证码发送过程中发生错误，将抛出异常
     */
    @GetMapping("/user/sendCode")
    public R sendCode(String phone) throws Exception {
        // 记录发送验证码的日志，以便于后续的审计和问题排查
        log.info("sendCode phone:{}", phone);

        // 调用用户服务中的发送验证码方法，实际的发送逻辑在该方法中实现
        userService.sendCode(phone);

        // 返回成功结果，表示验证码发送成功
        return R.suceess("验证码发送成功");
    }

    // 用户登录接口
    @PostMapping("/user/login")
    public R login(@RequestBody User user) {
        // 调用服务层方法进行登录验证
        User user1 = userService.login(user);

        // 登录验证结果判断
        if (user1 == null) {
            // 登录失败，返回错误信息
            return R.error();
        } else {
            // 3:生成token
            String token = UUID.randomUUID().toString();
            log.info("login token:{}", token);

            //4:存入到redis  key：token，value：user        USER:LOGIN:123
            redisTemplate.opsForValue().set(token, JSON.toJSONString(user1), 1, TimeUnit.HOURS);

            // 登录成功，返回token
            return R.suceess(token);
        }
    }


//    @PostMapping("/updatePsd")
//    Boolean updatePsd(@RequestBody User byId){
//        return userService.updatePsd(byId);
//    }
//    @PostMapping("/change_password")
//    public boolean changePassword(@RequestParam("username") String username,
//                                  @RequestParam("oldPassword") String oldPassword,
//                                  @RequestParam("newPassword") String newPassword) {
//        return userService.changePassword(username, oldPassword, newPassword);
//    }


    @GetMapping("/findUserById/{token}")
    public Result findUserById(@PathVariable("token") String token) {
        // 这里实现根据id查询用户的具体业务逻辑，比如从数据库获取用户信息等
        return userService.findUserById(token);
    }

    /**
     * 修改密码
     *
     * @param userPass 用户密码对象，包含用户名和新密码
     *                 由请求体自动绑定
     *                 返回修改密码结果
     */
    @PostMapping("/UpdatePassWord")
    public Result UpdatePassWord(@RequestBody UserPass userPass) {
        return userService.UpdatePassWord(userPass);
    }

    /**
     * 修改用户信息
     *
     * @param user 用户对象，包含用户信息，由请求体自动绑定
     */
    @PostMapping("updateUser")
    public Result updateUser(@RequestBody User user) {
        return userService.updateUser(user);
    }

}
